package com.dragon.service;

import com.dragon.pojo.CodePayload;
import com.dragon.pojo.ExecuteCodeResponse;
import com.dragon.pojo.ExecuteMessage;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.List;

@Service
public interface SandboxService {
    /**
     * 1. 把用户的代码保存成文件
     * @param code 用户输入的代码的字符串
     * @return 返回保存后的 java 文件对象
     */
    File saveCodeToFile(String code);

    /**
     * 2. 编译代码
     * 将 java 源码文件编译为 .class 字节码文件
     * @param userCodeFile java 已保存的源码文件对象
     * @return 返回 ExecuteMessage 对象，保存编译过程的标准输出、错误输出、退出码等
     */
    ExecuteMessage compileFile(File userCodeFile);

    /**
     * 3.执行 .class 字节码文件，运行每一个测试用例，收集输出结果
     * @param userCodeFile .class 源代码文件
     * @param inputList 输入参数列表
     * @param timeLimit 时间限制
     * @return ExecuteMessage 列表
     */
    List<ExecuteMessage> runFile(File userCodeFile, List<String> inputList, long timeLimit);

    /**
     * 4.获取输出结果
     * 返回给用户最终地执行结果
     *
     * @param executeMessageList 执行过程中收集到的多个 ExecuteMessage 对象列表
     * @param codeFile 代码文件
     * @return 响应结果
     */
    ExecuteCodeResponse getOutputResponse(List<ExecuteMessage> executeMessageList, CodePayload payload, File codeFile);

    /**
     * 5.删除临时文件
     * @param userCodeFile 已保存的源码文件对象
     */
    void deleteFile(File userCodeFile);

    /**
     * 获取文件名
     * @param codeFile 代码文件
     * @return 文件名
     */
    long getFileSize(File codeFile);

//    /**
//     * 获取源代码
//     * @param codeFile 代码文件
//     * @return 源代码
//     */
//    String getSourceCode(File codeFile);
}

